《高性能網(wǎng)站建設指南》閱讀筆記_規則6- 將腳本放在底部
發(fā)布時(shí)間:2013-11-22 瀏覽:386打印字號:大中小
將樣式表放在頂部這一點(diǎn)我想應該沒(méi)有人反對的了,但將腳本放在底部這一點(diǎn)我想很多網(wǎng)站都習慣直接放在樣式下面,我們的taoche也是一樣。
如果對于小網(wǎng)站來(lái)說(shuō)這樣并無(wú)所謂,但對于每天幾十萬(wàn)流量的大網(wǎng)站來(lái)說(shuō),這就影響大了,就像蝴蝶效應。
我們找個(gè)例子:
打開(kāi)易車(chē)網(wǎng)的首頁(yè),查看源代碼,我們會(huì )發(fā)現除了一個(gè)基本JS外,其他的腳本都是放在最底部,我又看了下汽車(chē)之家的選車(chē)也是,發(fā)現除了少量幾個(gè)控制樣式的js放在頂部,其他的也都放在了尾部。
前面提到對響應時(shí)間影響的是頁(yè)面中組件的數量。當緩存為空時(shí),每個(gè)組件都會(huì )產(chǎn)生一個(gè)HTTP請求,有時(shí)即便緩存是完整的亦是如此。要知道瀏覽器會(huì )并行的執行HTTP請求,大家可能會(huì )問(wèn),為什么HTTP請求的數量會(huì )影響響應時(shí)間呢?瀏覽器不能一次將它們都下載下來(lái)嗎?對此的解釋要回到HTTP1.1規范 (我找了一個(gè)中文版的給大家),該規范建議瀏覽器從每一個(gè)主機名并行地下載兩個(gè)組件。關(guān)于瀏覽器的并行下載數:瀏覽器的并行下載進(jìn)程數(firefox默認最多為6個(gè),IE8據說(shuō)最多為8個(gè),opera 9和Safari最多 為4個(gè))
很多WEB頁(yè)面需要從一個(gè)主機名下載所有的組件。查看這些HTTP請求會(huì )發(fā)現它們是呈階梯狀的.
瀏覽器的并行下載進(jìn)程數是可以修改的,如使用Firefox中的插件FastestFox,但我們不應該依賴(lài)用戶(hù)來(lái)修改瀏覽器設置,這個(gè)可以簡(jiǎn)單的使用DNS別名,來(lái)將組件分別放到多個(gè)主機名中(新浪微博把這點(diǎn)發(fā)揮到極點(diǎn)–10個(gè)圖片域名)。Yahoo的研究表明,使用兩個(gè)主機名比使用1、4或10個(gè)主機名能。
腳本阻塞下載
并行下載組件的優(yōu)點(diǎn)是很明顯。但在下載腳本的時(shí)候并行下載實(shí)際上是被禁用——即使使用了不同的主機名,瀏覽器也不會(huì )啟動(dòng)其他的下載。其中一個(gè)原因是,腳本可能使用了document.write來(lái)修改頁(yè)面內容,因此瀏覽器會(huì )等到,以確保頁(yè)面能溝恰當地布局。
正確地放置
我們使用的腳本加載時(shí)間很可能比我們預期的時(shí)間長(cháng)很多,因為用戶(hù)的帶寬也回影響腳本的響應時(shí)間。
而在我們開(kāi)發(fā)過(guò)程中,很多情況我們很難講腳本移到底部。比如剛才說(shuō)得腳本使用了document.write向頁(yè)面中插入了內容,就不能將其移動(dòng)到頁(yè)面中靠后的位置。
這里就出現了另外一種建議就是使用延遲腳本。defer屬性表明腳本不包含document.write,瀏覽器得到這一線(xiàn)索就可繼續進(jìn)行呈現。但是如果一個(gè)腳本可以延遲,那么它就一定可以移到頁(yè)面底部。而且延遲腳本只適用于IE對火狐不好使。所以底部最優(yōu)。


